package org.example.study1;

// Runnable接口实现方式的线程类
public class Demo03_Runnable {
    public static void main(String[] args) {
        // 创建Runnable的实例，实现了Runnable的任务对象（非线程对象）
        MyRunnable01 myRunnable01 = new MyRunnable01();


        /**
         * 关键线程构造方法：Thread(Runnable target)
         * 优势：
         * 1. 实现线程与任务的解耦
         * 2. 同一个任务可被多个线程执行
         * 3. 避免Java单继承的限制
         */
        // 创建线程，将任务绑定在线程
        Thread thread = new Thread(myRunnable01);//线程需要执行什么任务就传什么
        // 启动线程，创建PCB，参与CPU调度
        thread.start();

        // 主线程任务（与子线程并发执行）
        while (true) {
            try {
                // 让线程休眠一会
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello main thread...");
        }
    }
}



/**
 * 任务实现类（实现Runnable接口），单独定义了线程的任务对象
 * 设计优势：
 * 1. 符合单一职责原则（线程控制与业务逻辑分离）
 * 2. 方便实现资源共享（多个线程共享同一个Runnable实例）
 * 3. 更适合线程池等高级用法
 */
class MyRunnable01 implements Runnable {

    // 实现具体的任务
    /**
     * 核心任务方法（由线程调度执行）
     * 与Thread方式的区别：
     * 1. 没有直接继承Thread的方法
     * 2. 需通过Thread.currentThread()获取当前线程
     */
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello my runnable...");
        }
    }
}

/*输出：
        hello main thread...
        hello my runnable...
        hello main thread...
        hello my runnable...
        hello main thread...
        hello my runnable...
        hello main thread...
        。。。。。。*/
// 输出现象是两个死循环可以同时进行互不干扰。但是线程的执行顺序并没有什么规律，这个和CPU调度有关
// 由于CPU调度是“抢占式”执行的，所以哪个线程当前占用CPU是不确定的
